package com.tw.modules.config;


import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.baomidou.mybatisplus.enums.FieldFill;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.FileOutConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.TemplateConfig;
import com.baomidou.mybatisplus.generator.config.converts.MySqlTypeConvert;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.config.rules.DbType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 *  @Description : MybatisPlus代码生成�?
 * 
 */
public class GeneratorConfig {


    private static String packageName="modules";          //文件路径
    private static String authorName="maxiaodong";        //作�??
    private static String table="tw_user";           //table名字
    private static String prefix="tw_";                     //table前缀
    private static File file = new File("src");
    private static String path = file.getAbsolutePath();
    
    public static void main(String[] args) {
        // 自定义需要填充的字段
        List<TableFill> tableFillList = new ArrayList<>();
        tableFillList.add(new TableFill("User", FieldFill.INSERT_UPDATE));
        System.out.println("path:"+path);
        // 代码生成�?
        AutoGenerator mpg = new AutoGenerator().setGlobalConfig(
                // 全局配置
                new GlobalConfig()
                        .setOutputDir(path+"/main/java")//输出目录
                        .setFileOverride(true)// 是否覆盖文件
                        .setActiveRecord(true)// �?�? activeRecord 模式
                        .setEnableCache(false)// XML 二级缓存
                        .setBaseResultMap(true)// XML ResultMap
                        .setBaseColumnList(true)// XML columList
                        .setOpen(false)//生成后打�?文件�?
                        .setAuthor(authorName)
                        
                // 自定义文件命名，注意 %s 会自动填充表实体属�?�！
                 .setMapperName("%sMapper")
                 .setXmlName("%sMapper")
                 .setServiceName("%sService")
                 .setServiceImplName("%sServiceImpl")
                 .setControllerName("%sController")
         
        ).setDataSource(
                // 数据源配�?
                new DataSourceConfig()
                        .setDbType(DbType.MYSQL)// 数据库类�?
                        .setTypeConvert(new MySqlTypeConvert() {
                            // 自定义数据库表字段类型转换�?�可选�??
                            @Override
                            public DbColumnType processTypeConvert(String fieldType) {
                                System.out.println("转换类型�?" + fieldType);
                                // if ( fieldType.toLowerCase().contains( "tinyint" ) ) {
                                //    return DbColumnType.BOOLEAN;
                                // }
                                return super.processTypeConvert(fieldType);
                            }
                        })
                        .setDriverName("com.mysql.jdbc.Driver")
                        .setUsername("root")
                        .setPassword("123456")
                        .setUrl("jdbc:mysql://127.0.0.1/tw?useUnicode=true&characterEncoding=utf-8&useSSL=true")
        ).setStrategy(
                // 策略配置
                new StrategyConfig()
                        // .setCapitalMode(true)// 全局大写命名
                        //.setDbColumnUnderline(true)//全局下划线命�?
                        .setTablePrefix(new String[]{prefix})// 此处可以修改为您的表前缀
                        .setNaming(NamingStrategy.underline_to_camel)// 表名生成策略
                        .setInclude(new String[] { table }) // �?要生成的表，多个表名传数�?
                        .setRestControllerStyle(true)
                        //.setExclude(new String[]{"test"}) // 排除生成的表
                        // 自定义实体父�?
                        // .setSuperEntityClass("com.baomidou.demo.TestEntity")
                        // 自定义实体，公共字段
                        //.setSuperEntityColumns(new String[]{"test_id"})
                        .setTableFillList(tableFillList)
                // 自定�? mapper 父类
                // .setSuperMapperClass("com.baomidou.demo.TestMapper")
                // 自定�? service 父类
                // .setSuperServiceClass("com.baomidou.demo.TestService")
                // 自定�? service 实现类父�?
                // .setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl")
                // 自定�? controller 父类
                //.setSuperControllerClass("com.baomidou."+packageName+".controller.AbstractController")
                // 【实体�?�是否生成字段常量（默认 false�?
                // public static final String ID = "test_id";
                // .setEntityColumnConstant(true)
                // 【实体�?�是否为构建者模型（默认 false�?
                // public User setName(String name) {this.name = name; return this;}
                // .setEntityBuilderModel(true)
                // 【实体�?�是否为lombok模型（默�? false�?<a href="https://projectlombok.org/">document</a>
                // .setEntityLombokModel(true)
                // Boolean类型字段是否移除is前缀处理
                // .setEntityBooleanColumnRemoveIsPrefix(true)
                // .setRestControllerStyle(true)
                // .setControllerMappingHyphenStyle(true)
        ).setPackageInfo(
                // 包配�?
                new PackageConfig()
                       // .setModuleName("Sub")
                        .setParent("com.tw."+packageName)// 自定义包路径
                        .setController("web")// 这里是控制器包名，默�? web
                        .setEntity("entity")
                        .setMapper("dao")
                        .setService("service")
                        .setServiceImpl("serviceImpl")
                       //.setXml("mappings")
        ).setTemplate(
                // 关闭默认 xml 生成，调整生�? �? 根目�?
                new TemplateConfig()
                // 自定义模板配置，模板可以参�?�源�? /mybatis-plus/src/main/resources/template 使用 copy
                // 至您项目 src/main/resources/template 目录下，模板名称也可自定义如下配置：
                // .setController("/templates/controller.java.vm")
                // .setEntity("/templates/entity.java.vm")
                //.setMapper("/templates/mapper.java.vm")
               // .setService("/templates/service.java.vm")
               // .setServiceImpl("/templates/serviceImpl.java.vm")
                .setXml(null)
        ).setCfg(
                // 注入自定义配置，可以�? VM 中使�? cfg.complete 设置的�??
                new InjectionConfig() {
                    @Override
                    public void initMap() {
                        Map<String, Object> map = new HashMap<>();
                        map.put("complete",  "Generation success!");  //自定义完成后输出信息
                        this.setMap(map);
                    }
                }
                .setFileOutConfigList(Collections.<FileOutConfig>singletonList(new FileOutConfig("/templates/mapper.xml.vm") //设置模板路径
                {
                    // 自定义xml输出文件目录
                    @Override
                    public String outputFile(TableInfo tableInfo) {
                        return path+"/main/resources/mappings/UserMapper.xml";
                    }
                }))
             	
    
        );

     /*   
        // 自定�? xxList.jsp 生成 
        List<FileOutConfig> focList = new ArrayList<FileOutConfig>();
        focList.add(new FileOutConfig("/template/list.jsp.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名�?
                return "D://my_" + tableInfo.getEntityName() + ".jsp";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        
          // 调整 xml 生成目录演示
         focList.add(new FileOutConfig("/templates/mapper.xml.vm") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                return "/develop/code/xml/" + tableInfo.getEntityName() + ".xml";
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        */
        
        // 执行生成
        mpg.execute();

        // 打印注入设置，这里演示模板里面�?�么获取注入内容【可无�??
        System.err.println(mpg.getCfg().getMap().get("complete"));
    }	
	
	
	
	
}
